﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using SeizyUtils.Common.Utilities;
using SeizyUtils.AppCode.Common.Data.Csv;

namespace SeizyUtils.Common.Data.Csv
{
    class CsvReader : ICsvReader
    {

        private readonly StreamReader _reader;
        private ColumnModel _columnModel;

        public CsvReader(HandyFile file)
        {
            _reader = new StreamReader(file.getFileStream(FileMode.Open), Encoding.GetEncoding("Shift_JIS"));

            // カラム情報の取得
            string line = _reader.ReadLine();
            if (!String.IsNullOrEmpty(line))
            {
                IList<string> tokens = ParseCsvLine(line);
                _columnModel = new ColumnModel(tokens);
            }
            
        }

        public ICsvRecord readLine()
        {
            if (_columnModel == null)
            {
                return null;
            }

            // _readerから一行読み取る
            string line = _reader.ReadLine();

            ICsvRecord record = null;
            if (line != null)
            {
                // トークンに分割する
                IList<string> tokens = ParseCsvLine(line);

                // レコードを生成し、バインドする
                record = new CsvRecord(_columnModel, tokens);
            }
            return record;
        }

        public void close()
        {
            _reader.Close();
        }

        private static IList<string> ParseCsvLine(string line)
        {
            IList<string> result = CsvHelper.splitCsvLine(line);
            return result;
        }


        #region IDisposable メンバ

        public void Dispose()
        {
            close();
        }

        #endregion
    }
}
